﻿// Copyright (c) 2012 Mokah Nnamezie & Andrew Cooper
// Neo4Net graph database - http://neo4net.codeplex.com
//
// This file is part of Neo4Net - a .Net port of the Neo4j graph database
//
// Neo4Net is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.

namespace Neo4Net.Kernel.Impl.Core
{
    using System.Diagnostics;
    using System.Linq;
    using Neo4Net.GraphDb;
    using Neo4Net.GraphDb.Factory;
    using Neo4Net.Test;
    using Neo4Net.Tooling;
    using NUnit.Framework;

    [TestFixture]
    public class TestCrashWithRebuildSlow
    {
        [Test]
        public void CrashAndRebuildSlowWithDynamicStringDeletions()
        {
            // Produce the string store with holes in it
            string dir = TargetDirectory.ForTest(GetType()).Directory("holes", true).FullName;
            Process process = Process.Start("Neo4Net.Kernel.Tests.ProduceNonCleanDefraggedStringStore.exe", "\"" + dir + "\"");
            process.WaitForExit();

            Assert.That(process.ExitCode, Is.EqualTo(0));

            // Recover with rebuild_idgenerators_fast=false
            IGraphDatabaseService db = new GraphDatabaseFactory().NewEmbeddedDatabaseBuilder(dir)
                                                                 .SetConfig(GraphDatabaseSettings.RebuildIdgeneratorsFast, GraphDatabaseSetting.False)
                                                                 .NewGraphDatabase();
            try
            {
                int nameCount = 0;
                int relCount = 0;
                foreach (INode node in GlobalGraphOperations.At(db).GetAllNodes())
                {
                    if (node.Equals(db.ReferenceNode))
                        continue;
                    nameCount++;
                    Assert.That(node.GetProperty("name"), Is.Not.Null);
                    relCount += node.GetRelationships(Direction.Outgoing).Count();
                }

                Assert.That(nameCount, Is.EqualTo(16));
                Assert.That(relCount, Is.EqualTo(12));
            }
            finally
            {
                db.Shutdown();
            }
        }
    }
}
